<!DOCTYPE HTML>
<html lang="en">

<head>
    <!--Setting-->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <meta http-equiv="Cache-Control" content="no-siteapp">
    <meta http-equiv="Cache-Control" content="no-transform">
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
    <meta name="apple-mobile-web-app-capable" content="Hexo">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no,email=no,adress=no">
    <meta name="browsermode" content="application">
    <meta name="screen-orientation" content="portrait">
    <meta name="theme-version" content="1.2.3">
    <meta name="root" content="/myblogs/">
    <link rel="dns-prefetch" href="http://thammer.gitee.io/myblogs">
    <!--SEO-->

<meta name="keywords" content="硬件 接口" />


<meta name="description" content="目录
1.什么是SPI

2.SPI接口

2.1.SPI模式：极性和时钟相位
2.2.SPI三线总线和多IO配置


3.SPI总线事务

3.1.简单SPI写事务
3.2.简单SPI读事务
..." />


<meta name="robots" content="all" />
<meta name="google" content="all" />
<meta name="googlebot" content="all" />
<meta name="verify" content="all" />
    <!--Title-->

<title>
    
    SPI接口介绍 |
    
    Hexo
</title>

<link rel="alternate" href="/atom.xml" title="Hexo" type="application/atom+xml">


<link rel="icon" href="/favicon.ico">

    


<link rel="stylesheet" href="/myblogs/css/bootstrap.min.css?rev=3.3.7.css">
<link rel="stylesheet" href="/myblogs/css/font-awesome.min.css?rev=4.7.0.css">
<link rel="stylesheet" href="/myblogs/css/style.css?rev=@@hash.css">

    
<div class="hide">
    <script type="text/javascript">
    var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");
    document.write(unescape("%3Cspan class='cnzz_stat_icon_1263868967 hide' %3E%3Cscript%20src%3D%22https%3A%2F%2Fs95.cnzz.com%2Fz_stat.php%3Fweb_id%3D1272564536%22%3E%3C%2Fscript%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s19.cnzz.com/z_stat.php%3Fid%3D1263868967%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));
    </script>
</div>




    

<meta name="generator" content="Hexo 4.2.0"></head>
<!--[if lte IE 8]>
<style>
    html{ font-size: 1em }
</style>
<![endif]-->
<!--[if lte IE 9]>
<div style="ie">你使用的浏览器版本过低，为了你更好的阅读体验，请更新浏览器的版本或者使用其他现代浏览器，比如Chrome、Firefox、Safari等。</div>
<![endif]-->
<body>
    <header class="main-header"  style="background-image:url(
    http://snippet.shenliyang.com/img/banner.jpg)"
     >
    <div class="main-header-box">
        <a class="header-avatar" href="/" title='John Doe'>
            <img src="/myblogs/img/avatar.jpg" alt="logo头像" class="img-responsive center-block">
        </a>
        <div class="branding">
            <!--<h2 class="text-hide">Snippet主题,从未如此简单有趣</h2>-->
            
            <img src="/myblogs/img/branding.png" alt="Snippet 博客主题" class="img-responsive center-block">
            
        </div>
    </div>
</header>
    <nav class="main-navigation">
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <div class="navbar-header"><span class="nav-toggle-button collapsed pull-right" data-toggle="collapse" data-target="#main-menu" id="mnav">
                        <span class="sr-only"></span>
                        <i class="fa fa-bars"></i>
                    </span>
                    <a class="navbar-brand" href="http://thammer.gitee.io/myblogs">
                        Hexo</a>
                </div>
                <div class="collapse navbar-collapse" id="main-menu">
                    <ul class="menu">
                        
                        <li role="presentation" class="text-center">
                            <a href="/"><i class="fa "></i>
                                Home</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/categories/前端/"><i class="fa "></i>
                                前端</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/categories/后端/"><i class="fa "></i>
                                后端</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/categories/工具/"><i class="fa "></i>
                                工具</a>
                        </li>
                        
                        <li role="presentation" class="text-center">
                            <a href="/archives/"><i class="fa "></i>
                                时间轴</a>
                        </li>
                        
                    </ul>
                </div>
            </div>
        </div>
    </div>
</nav>
    <section class="content-wrap">
        <div class="container">
            <div class="row">
                <main class="col-md-8 main-content m-post">
                    <p id="process"></p>
<article class="post">
    <div class="post-head">
        <h1 id="SPI接口介绍">
            
            SPI接口介绍
            
        </h1>
        <div class="post-meta">
    
    <span class="categories-meta fa-wrap">
        <i class="fa fa-folder-open-o"></i>
        <a class="category-link" href="/myblogs/categories/%E7%A1%AC%E4%BB%B6/">硬件</a>
    </span>
    
    
    <span class="fa-wrap">
        <i class="fa fa-tags"></i>
        <span class="tags-meta">
            
            <a class="tag-link" href="/myblogs/tags/%E7%A1%AC%E4%BB%B6-%E6%8E%A5%E5%8F%A3/" rel="tag">硬件 接口</a>
            
        </span>
    </span>
    
    
    
    <span class="fa-wrap">
        <i class="fa fa-clock-o"></i>
        <span class="date-meta">
            2019/08/13</span>
    </span>
    
    
</div>
        
        
    </div>
    
    <div class="post-body post-content">
        <h1 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h1><ul>
<li><p><a href="#1什么是spi">1.什么是SPI</a></p>
</li>
<li><p><a href="#2SPI接口">2.SPI接口</a></p>
<ul>
<li><a href="#21spi模式极性和时钟相位">2.1.SPI模式：极性和时钟相位</a></li>
<li><a href="#22spi三线总线和多io配置">2.2.SPI三线总线和多IO配置</a></li>
</ul>
</li>
<li><p><a href="#3spi总线事务">3.SPI总线事务</a></p>
<ul>
<li><a href="#31简单spi写事务">3.1.简单SPI写事务</a></li>
<li><a href="#32简单spi读事务">3.2.简单SPI读事务</a></li>
<li><a href="#33四线io事务">3.3.四线IO事务</a></li>
</ul>
</li>
</ul>
<h1 id="1-什么是SPI"><a href="#1-什么是SPI" class="headerlink" title="1.什么是SPI"></a>1.什么是SPI</h1><p><strong>SPI</strong>(Serial Peripheral Interface)[串行外围接口]<strong>是一种接口总线，通常用于与闪存、传感器、实时时钟(RTCs)、模数转换器等进行通信。</strong> 串行外围接口(SPI)总线是由摩托罗拉公司开发的，用于在主设备和从设备之间提供全双工同步串行通信。</p>
<p><a href="https://www.corelis.com/whitepapers/request-whitepaper-spi-tutorial/" target="_blank" rel="noopener">SPI教程白皮书</a></p>
<h1 id="2-SPI接口"><a href="#2-SPI接口" class="headerlink" title="2.SPI接口"></a>2.SPI接口</h1><p>如图1所示，一个标准的SPI连接涉及到一个主机<code>master</code>使用串行时钟(SCK)、主输出从输入(MOSI)、主输出从输出(MISO)和从选择(SS)线连接到一个或几个从机<code>slave</code>。SCK、MOSI和MISO信号可以由从机<code>slave</code>共享，而每个从机<code>slave</code>都有一条惟一的SS线。</p>
<p><img src="https://www.corelis.com/wp-content/uploads/2017/05/1-11-1.jpg" alt=""></p>
<p><strong>Figure 1. 4-wire SPI bus configuration with multiple slaves</strong></p>
<h2 id="2-1-SPI模式：极性和时钟相位"><a href="#2-1-SPI模式：极性和时钟相位" class="headerlink" title="2.1.SPI模式：极性和时钟相位"></a>2.1.SPI模式：极性和时钟相位</h2><p>SPI接口没有定义数据交换协议，限制了开销并允许高速数据流。时钟极性(CPOL)和时钟相位(CPHA)可以指定为“0”或“1”，形成四种独特的模式，以提供主从通信的灵活性，如图2所示。</p>
<p><img src="https://www.corelis.com/wp-content/uploads/2017/05/1-21.jpg" alt=""></p>
<p><strong>Figure 2. SPI bus timing</strong></p>
<p>如果<code>CPOL</code>和<code>CPHA</code>都为’ 0 ‘(定义为模式0)，则在时钟的前上升沿采样数据。目前,模式0是SPI总线通信最常见的模式。如果<code>CPOL</code>为’ 1 ‘，<code>CPHA</code>为’ 0 ‘(模式2)，则在时钟的前降边缘采样数据。同样，<code>CPOL</code> = ‘ 0 ‘和<code>CPHA</code> = ‘ 1 ‘ (Mode 1)在尾降边缘采样，<code>CPOL</code> = ‘ 1 ‘和<code>CPHA</code> = ‘ 1 ‘ (Mode 3)在尾升边缘采样。下面的表1总结了可用的模式</p>
<blockquote>
<p>CPOL：时钟极性，表示时钟线空闲时是高电平<code>1</code>还是低电平<code>0</code>。<br>CPHA：时钟相位，表示是在时钟的前沿<code>0</code>还是尾沿<code>1</code>采样数据。</p>
</blockquote>
<table>
<thead>
<tr>
<th align="center">Mode</th>
<th align="center">CPOL</th>
<th align="center">CPHA</th>
</tr>
</thead>
<tbody><tr>
<td align="center">0</td>
<td align="center">0</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">0</td>
<td align="center">1</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">1</td>
<td align="center">0</td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">1</td>
<td align="center">1</td>
</tr>
</tbody></table>
<p><strong>Table 1. SPI mode definitions</strong></p>
<h2 id="2-2-SPI三线总线和多IO配置"><a href="#2-2-SPI三线总线和多IO配置" class="headerlink" title="2.2.SPI三线总线和多IO配置"></a>2.2.SPI三线总线和多IO配置</h2><p>除了标准的4线配置外，SPI接口还扩展到包括各种IO标准，包括用于减少引脚数的3线和用于更高吞吐量的双或四I/O。</p>
<p>在3线模式下，MOSI和MISO线路组合成单个双向数据线，如图3所示。事务是半双工的，以允许双向通信。减少数据线的数量并以半双工模式运行也会降低最大可能的吞吐量; 许多3线设备具有低性能要求，而设计时考虑到低引脚数。</p>
<p><img src="https://www.corelis.com/wp-content/uploads/2017/05/1-31.jpg" alt=""></p>
<p><strong>Figure 3. 3-wire SPI configuration with one slave</strong></p>
<p>多I/O变体（如双I/O和四I/O）在标准外添加了额外的数据线，以提高吞吐量。利用多I/O模式的组件可以与并行器件的读取速度相媲美，同时仍然可以减少引脚数量。这种性能提升使得能够从闪存中随机访问和直接执行程序（XIP）。</p>
<p>例如，四路I/O设备在与高速设备通信时可提供四倍于标准4线SPI接口的性能。图4显示了单个四通道IO从站配置的示例。</p>
<p><img src="https://www.corelis.com/wp-content/uploads/2017/05/2-41.jpg" alt=""></p>
<p><strong>Figure 4. Quad IO SPI configuration with one slave</strong></p>
<h1 id="3-SPI总线事务"><a href="#3-SPI总线事务" class="headerlink" title="3.SPI总线事务"></a>3.SPI总线事务</h1><p>SPI协议没有定义数据流的结构; 数据的组成完全取决于组件设计者。但是，许多设备遵循相同的基本格式来发送和接收数据，从而允许来自不同供应商的部件之间的互操作性。</p>
<h2 id="3-1-简单SPI写事务"><a href="#3-1-简单SPI写事务" class="headerlink" title="3.1.简单SPI写事务"></a>3.1.简单SPI写事务</h2><p>大多数SPI闪存都有一个写状态寄存器命令，用于写入一个或两个字节的数据，如图5所示。要写入状态寄存器，SPI主机首先启用当前器件的从选择线。然后，主设备输出适当的指令，后跟两个数据字节，用于定义预期的状态寄存器内容。由于事务不需要返回任何数据，因此从设备将MISO线保持在高阻抗状态，并且主设备屏蔽任何输入数据。最后，从机选择信号被取消以结束事务。</p>
<p><img src="https://www.corelis.com/wp-content/uploads/2017/05/1-51.jpg" alt=""></p>
<p><strong>Figure 5. Write command using a single-byte instruction and two-byte data word</strong></p>
<h2 id="3-2-简单SPI读事务"><a href="#3-2-简单SPI读事务" class="headerlink" title="3.2.简单SPI读事务"></a>3.2.简单SPI读事务</h2><p>状态寄存器读取事务与写入事务类似，但现在利用从器件返回的数据，如图6所示。在发送读取状态寄存器指令后，从器件开始以MISO线路传输数据，数率为每八个时钟周期一个字节。主机接收比特流并通过取消SS信号来完成事务。</p>
<p><img src="https://www.corelis.com/wp-content/uploads/2017/05/1-61.jpg" alt=""></p>
<p><strong>Figure 6. Read command using a single-byte instruction and two-byte data word</strong></p>
<h2 id="3-3-四线IO事务"><a href="#3-3-四线IO事务" class="headerlink" title="3.3.四线IO事务"></a>3.3.四线IO事务</h2><p>由于其性能的提高，四线IO在闪存中越来越受欢迎。四线IO没有使用单输出和单输入接口，而是使用4条独立的半双工数据线来传输和接收数据，其性能是标准四线SPI的四倍。</p>
<p>图7显示了Spansion S25FL016K串行NorFLASH器件的读取示例命令。要从器件读取，主器件首先在第一个IO线上发送快速读取命令（EBh），而其他所有命令都处于三态。接下来，主机发送地址; 由于接口现在有4条双向数据线，因此它可以利用它们在8个时钟周期内发送一个完整的24位地址和8个模式位。然后，该地址跟随2个虚拟字节（4个时钟周期），以允许器件有额外的时间来设置初始地址。</p>
<p><img src="https://www.corelis.com/wp-content/uploads/2017/05/1-71.jpg" alt=""></p>
<p><strong>Figure 7. Quad mode fast read sequence for Spansion S25FL016K or equivalent</strong></p>
<p>在主机发送地址周期和虚拟字节之后，组件开始发送数据字节; 每个时钟周期由分布在4个IO线上的数据半字节组成，每个数据字节总共有两个时钟周期。将此与我们简单读取事务所需的16个时钟周期进行比较，很容易看出为什么四模式在高速闪存应用中越来越受欢迎！</p>

    </div>
    
    <div class="post-footer">
        <div>
            
            转载声明：
            商业转载请联系作者获得授权,非商业转载请注明出处 © <a href="" target="_blank">Snippet</a>
            
            
        </div>
        <div>
            
        </div>
    </div>
</article>
<div class="article-nav prev-next-wrap clearfix">
    
    <a href="/myblogs/2019/08/17/zigbee%E5%85%B3%E8%81%94%E5%85%A5%E7%BD%91%E4%BB%8B%E7%BB%8D/" class="pre-post btn btn-default" title='ZigBee设备入网流程'>
        <i class="fa fa-angle-left fa-fw"></i><span class="hidden-lg">上一篇</span>
        <span class="hidden-xs">
            ZigBee设备入网流程</span>
    </a>
    
    
</div>

<div id="comments">
    

<div id="vcomments" class="valine"></div>

<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src="/myblogs/assets/valine.min.js"></script>

<script>
new Valine({
    av: AV,
    el: '#vcomments',
    appId: 'xOKV9J4UeQAtVkvnJC7Kq2Jn-gzGzoHsz',
    appKey: 'erIpQac4azoCmgfBB7Dl9maa',
    placeholder: '说点什么吧',
    notify: false,
    verify: true,
    avatar: 'mm',
    meta: 'nick,mail'.split(','),
    pageSize: '10',
    path: window.location.pathname,
    lang: 'en'.toLowerCase()
})
</script>


</div>

                </main>
                
                    <aside id="article-toc" role="navigation" class="col-md-4">
    <div class="widget">
        <h3 class="title">
            Table of Contents
        </h3>
        
        <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#目录"><span class="toc-text">目录</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#1-什么是SPI"><span class="toc-text">1.什么是SPI</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#2-SPI接口"><span class="toc-text">2.SPI接口</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#2-1-SPI模式：极性和时钟相位"><span class="toc-text">2.1.SPI模式：极性和时钟相位</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-2-SPI三线总线和多IO配置"><span class="toc-text">2.2.SPI三线总线和多IO配置</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#3-SPI总线事务"><span class="toc-text">3.SPI总线事务</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#3-1-简单SPI写事务"><span class="toc-text">3.1.简单SPI写事务</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3-2-简单SPI读事务"><span class="toc-text">3.2.简单SPI读事务</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3-3-四线IO事务"><span class="toc-text">3.3.四线IO事务</span></a></li></ol></li></ol>
        
    </div>
</aside>
                
            </div>
        </div>
    </section>
    <footer class="main-footer">
    <div class="container">
        <div class="row">
        </div>
    </div>
</footer>
<a id="back-to-top" class="icon-btn hide">
    <i class="fa fa-chevron-up"></i>
</a>
    <div class="copyright">
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <div class="busuanzi">
    
</div>
            </div>
            <div class="col-sm-12">
                <span>Copyright &copy;
                    2017
                    
                </span> |
                <span>
                    Powered by <a href="//hexo.io" class="copyright-links" target="_blank" rel="nofollow">Hexo</a>
                </span> |
                <span>
                    Theme by <a href="//github.com/shenliyang/hexo-theme-snippet.git" class="copyright-links" target="_blank" rel="nofollow">Snippet</a>
                </span>
            </div>
        </div>
    </div>
</div>




<script src="/myblogs/js/app.js?rev=@@hash.js"></script>

</body>
</html>